package io.objectstream;
//첫번째 예제, 직렬화 연습하기 
import io.objectstream.domain.Address;
import io.objectstream.domain.Member;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class ObjectStreamTest  {
 private String fileName = "c:\\day\\member.obj";
 //매개변수로 받은 객체를 fileName 경로의 파일에 출력 처리
 //객체 출력 - 객체 직렬환 : ObjectOutPutStream(filter)
 public void writeObject(Object obj) throws IOException{
	 ObjectOutputStream oos = null;
	 
	 try{
		 //1. 연결 + filtet
		 oos = new ObjectOutputStream(new FileOutputStream(fileName));
		 //2. 출력
		 oos.writeObject(obj);
	 }finally{
		 //3.연결닫기
		 if(oos!=null){
			 oos.close();
		 }
		 
	 }
 }
 	//fileName의 파일에서 객체를 입력받아 리턴 처리
 	//객체 입력 - 객체 역직렬화 : ObjectInputStream(filter)
 	public Object readObject() throws IOException, ClassNotFoundException{
 		ObjectInputStream ois = null;
 		try{
 			//1. 연결 + filter
 			ois = new ObjectInputStream(new FileInputStream(fileName));
 			//2. 입력
 			//그냥 읽는거 뿐만이 아니라 객체를 생성해야 한다.
 			Object obj = ois.readObject();
 			return obj;
 			

 		}finally {
 			if(ois != null){//일단 fileName과 연결이 되면 참조 주소값이 들어가기 때문에 null일 수가 없다.
 				ois.close();
 			}
 			
 		}
 	}
 
 
 	public static void main(String[] args) throws IOException, ClassNotFoundException{
	ObjectStreamTest ost = new ObjectStreamTest();
	//Member m = new Member("id-1","11111","홍길동",22);
	//ost.writeObject(m);
	Object o = ost.readObject();
	System.out.println(o);//객체를 자동으로 스트링으로 변환, 
	Member m2 = (Member)o;//개별적으로 부를려면 오브젝트 객체를 멤버객체로 형변환
	System.out.println("이름 : "+m2.getName());
	
	//Address addr = new Address("111-222", "서울시 종로구");
	//Address addr2 = m2.getAddress();
	//System.out.println("주소 : "+addr2.getZipcod()+","+addr2.getAddress());
}
}
